<?php

namespace App\Logics;


use App\Models\AdminLog;
use App\Service\Option;


class Logic
{

    // 需要用的
    protected $error;
    protected $option;
    protected $view;
    protected $name;

    // 翻页等
    // $page $rows 查询的时候最好重新在获取一遍
    /*protected $rows;
    protected $page;
    protected $isPage;
    protected $id;*/

    // 控制器
    /*protected $module;
    protected $controller;
    protected $action;*/

    // 构造方法
    public function __construct()
    {
        $this->name = basename(str_replace('\\', '/', static::class));
        // 参数
        //$this->siteParam();
        // 初始化
        $this->initialize();
    }

    // 初始化
    protected function initialize() { }

    // 获取错误信息
    public function getError()
    {
        return $this->error;
    }

    #######################################################################################################
    ## 其他操作

    // 站点常用参数
    protected function siteParam()
    {
        /**
         * 实体 => 符号
         * htmlspecialchars 中文不会乱码（获取的时候过滤，取出数据库的时候也要 htmlspecialchars_decode 过滤）
         * htmlentities  必须制定编码，不然中文乱码
         *
         * 反函数
         * html_entity_decode
         * htmlspecialchars_decode
         */

        // 当前文件名
        $option = $this->option();
        $data   = $option->getData();

        // 控制器
        $parameters       = $option->request()->route()->parameters;
        $this->controller = $data['controller'] ?? ($parameters['controller'] ?? '');
        $this->action     = $data['action'] ?? ($parameters['action'] ?? '');
        $this->module     = $data['module'] ?? ($parameters['module'] ?? 'frontend');

        // 控制器和方法可能是自定义的
        $option->request()->offsetUnset('controller');
        $option->request()->offsetUnset('action');

        //$this->is_debug = Env::get('app_debug');
        $this->isPage = empty($option->getData('page')) ? true : false;
        $this->page   = $option->getData('page', 1, 'intval');
        $this->rows   = $option->getData('rows', 10, 'intval');
        $this->id     = $option->getData('id', 0, 'intval');
        if($this->page < 1){
            $this->page = 1;
        }
        if($this->rows < 1 || $this->rows > 1000){
            $this->rows = 15;
        }

        // 如果重新搜索 变为第一页
        /*if($this->request->isPost()){
            $this->page = 1;
        }*/
    }

    // 日志记录
    protected function log($param, $msg)
    {
        $logger = new LogFile();
        $logger->write($param, $msg);
    }

    // 实例化逻辑参数
    protected function option()
    {
        if(empty($this->option)){
            $this->option = new Option();
        }

        return $this->option;
    }

    // 获取id
    protected function id()
    {
        return $this->option()->getData('id', 0, 'intval');
    }

    // 获取当前ip
    protected function ip()
    {
        return $this->option()->getIp();
    }

    // 返回错误
    protected function _returnFail($error)
    {
        $this->error = $error;

        return false;
    }

    #######################################################################################################
    // 于构建前置与后置操作方法
    public function __call($method, $parameters)
    {
        $before = '_before_'.$method;
        $after  = '_after_'.$method;

        // 前置操作
        if(method_exists($this, $before)){
            $this->{$before}(...array_values($parameters));
        }

        $result = $this->{$method}(...array_values($parameters));

        // 后置操作
        if(method_exists($this, $after)){
            $this->{$after}(...array_values($parameters));
        }

        return $result;
    }
}
